package com.hksj.cbm.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * description：类DateTimeFormatUtil用于提供日期时间格式化工具函数
 *  参考网址：http://t.csdnimg.cn/2EM0d
 * @author niexiang
 * @date 2024/09/11 11:47
 */
public class DateTimeFormatUtil {
    /**
     * 获取指定日期范围内的日期列表，返回类型为 List<Date>
     *
     * @param startDate 开始日期，格式由 format 参数指定
     * @param endDate 结束日期，格式由 format 参数指定
     * @param format 日期格式，例如 "yyyy-MM-dd"
     * @param field Calendar 字段，用于指定增量应用的时间单位，例如 Calendar.DAY_OF_MONTH
     * @param increment 时间单位增量，用于控制时间进度的步长
     * @return 返回一个日期列表，包含开始日期到结束日期之间按指定格式和增量的所有日期
     */
    public static List<Date> getDateRangeAsDate(String startDate, String endDate, String format, int field, int increment) {
        List<Date> dateList = new ArrayList<>();
        SimpleDateFormat sdf = new SimpleDateFormat(format);

        try {
            Date dateStart = sdf.parse(startDate);
            Date dateEnd = sdf.parse(endDate);

            Calendar calendar = Calendar.getInstance();
            calendar.setTime(dateStart);

            while (calendar.getTime().before(dateEnd) || calendar.getTime().equals(dateEnd)) {
                dateList.add(calendar.getTime());

                calendar.add(field, increment);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return dateList;
    }

    /**
     * 获取指定日期范围内的日期列表，返回类型为 List<String>
     *
     * @param startDate 开始日期，格式由 format 参数指定
     * @param endDate 结束日期，格式由 format 参数指定
     * @param format 日期格式，例如 "yyyy-MM-dd"
     * @param field Calendar 字段，用于指定增量应用的时间单位，例如 Calendar.DAY_OF_MONTH
     * @param increment 时间单位增量，用于控制时间进度的步长
     * @return 返回一个日期列表，包含开始日期到结束日期之间按指定格式和增量的所有日期
     */
    public static List<String> getDateRangeAsString(String startDate, String endDate, String format, int field, int increment) {
        List<String> dateList = new ArrayList<>();
        SimpleDateFormat sdf = new SimpleDateFormat(format);

        try {
            Date dateStart = sdf.parse(startDate);
            Date dateEnd = sdf.parse(endDate);

            Calendar calendar = Calendar.getInstance();
            calendar.setTime(dateStart);

            while (calendar.getTime().before(dateEnd) || calendar.getTime().equals(dateEnd)) {
                dateList.add(sdf.format(calendar.getTime()));

                calendar.add(field, increment);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return dateList;
    }

    /**
     * 获取两个日期之间的所有天列表
     *
     * @param dateStart 开始日期，格式为"yyyy-MM-dd"
     * @param dateEnd 结束日期，格式为"yyyy-MM-dd"
     * @return 返回一个天列表，包含开始日期到结束日期之间所有的天
     */
    public static List<String> getDayList(String dateStart, String dateEnd) {
        return getDateRangeAsString(dateStart, dateEnd, "yyyy-MM-dd", Calendar.DAY_OF_MONTH, 1);
    }

    /**
     * 获取两个日期之间的所有月份列表
     *
     * @param dateStart 开始日期，格式为"yyyy-MM"
     * @param dateEnd 结束日期，格式为"yyyy-MM"
     * @return 返回一个月份列表，包含开始日期到结束日期之间所有的月份
     */
    public static List<String> getMonthList(String dateStart, String dateEnd) {
        return getDateRangeAsString(dateStart, dateEnd, "yyyy-MM", Calendar.MONTH, 1);
    }

    /**
     * 获取两个日期之间的所有小时列表
     *
     * @param dateStart 开始日期，格式为"yyyy-MM-dd HH"
     * @param dateEnd 结束日期，格式为"yyyy-MM-dd HH"
     * @return 返回一个小时列表，包含开始日期到结束日期之间所有的小时
     */
    public static List<String> getHourList(String dateStart, String dateEnd) {
        return getDateRangeAsString(dateStart, dateEnd, "yyyy-MM-dd HH:mm:ss", Calendar.HOUR_OF_DAY, 1);
    }

    /**
     * 获取两个日期之间的每一天的日期列表
     *
     * @param dateStart 开始日期，格式为"yyyy-MM-dd"
     * @param dateEnd   结束日期，格式为"yyyy-MM-dd"
     * @return 返回一个包含开始日期和结束日期之间每一天的Date对象的列表
     */
    public static List<Date> getDayListAsDate(String dateStart, String dateEnd) {
        return getDateRangeAsDate(dateStart, dateEnd, "yyyy-MM-dd", Calendar.DAY_OF_MONTH, 1);
    }

    /**
     * 获取两个日期之间的每个月的日期列表
     *
     * @param dateStart 开始日期，格式为"yyyy-MM"
     * @param dateEnd   结束日期，格式为"yyyy-MM"
     * @return 返回一个包含开始日期和结束日期之间每个月的Date对象的列表
     */
    public static List<Date> getMonthListAsDate(String dateStart, String dateEnd) {
        return getDateRangeAsDate(dateStart, dateEnd, "yyyy-MM", Calendar.MONTH, 1);
    }

    /**
     * 获取两个日期之间的每个小时的日期列表
     *
     * @param dateStart 开始日期，格式为"yyyy-MM-dd HH"
     * @param dateEnd   结束日期，格式为"yyyy-MM-dd HH"
     * @return 返回一个包含开始日期和结束日期之间每个小时的Date对象的列表
     */
    public static List<Date> getHourListAsDate(String dateStart, String dateEnd) {
        return getDateRangeAsDate(dateStart, dateEnd, "yyyy-MM-dd HH", Calendar.HOUR_OF_DAY, 1);
    }

}
